﻿using System.Collections.Generic;

using System.Web;
using com.byt.webcore;
using com.byt.webcore.utils;
using MYLSOFT.JsonSimple;
using com.byt.suce.db.mapper;
using com.byt.suce.db.factory;
using System.Collections;
using System.Data.Common;
using System.Text;
using System.IO;
using System.Xml;
using com.byt.suce.db.dao;

namespace suce.gestor
{

    public class Importar : ServletBase
    {

        private IPkgGestorServicio DAO = PkgGestorServicioFactory.create();


        protected override void doCommand(com.byt.webcore.ServletBase.Parameters p)
        {
            IMPORTAR(p);
        }

        private void IMPORTAR(ServletBase.Parameters p)
        {
            Connection vuce = null;

            try
            {
                // Leer los pendientes
                vuce = new Connection(AppConfig.getConnection(p, "integrador"));
                vuce.BeginTransaction();

                PkgGestorServicio.PendienteGetlistParam param = DAO.pendienteGetlist(vuce, p.getMap());
                JSONArray ja = Utils.getJSONArrayObject(param.CurOut);
                param.CurOut.Close();

                // Ingresar a SUCE
                StringBuilder sb = new StringBuilder();

                foreach (JSONObject jo in ja)
                {

                    if (jo["idactividad"].ToString().Equals("N18"))
                        RegistrarEbxmlMod(p, jo, (byte[])jo["ebxml"]);
                    else
                    {
                        // Guardar el EBXML
                        RegistrarEbxml(p, jo, (byte[])jo["ebxml"]);
                    }

                    // Ingresar el flujo
                    PkgWorkflow.InboxInsertParam ins = PkgWorkflowFactory.create().newInboxInsertParam(jo);
                    ins.Idactividad = jo["codformato"] + "-" + ins.Idactividad;
                    PkgWorkflowFactory.create().inboxInsert(p.conn, ins);

                    if (sb.Length > 0)
                        sb.Append(",");

                    if (jo["gestoriddoc"] != null)
                        sb.Append("DOC" + jo["gestoriddoc"]);
                    else if (jo["gestoridcda"] != null)
                        sb.Append("CDA" + jo["gestoridcda"]);
                }

                // Marcar como transferido
                if (sb.Length > 0)
                { 
                    PkgGestorServicio.PendienteMarcarTransferidoParam trans = DAO.newPendienteMarcarTransferidoParam();
                    trans.Iddocs = sb.ToString();
                    DAO.pendienteMarcarTransferido(vuce, trans);
                }
            }
            catch
            {
                if (vuce != null)
                    vuce.Rollback();
                throw;
            }
            finally
            {
                if (vuce != null)
                    vuce.Close();
            }

        }

        private void RegistrarEbxml(ServletBase.Parameters p, JSONObject transaccion, byte[] ebxml)
        {
            /*
            if (ebxml == null || ebxml.Length == 0)
                return;

            MemoryStream ms = new MemoryStream(ebxml);
            StreamReader sr = new StreamReader(ms);
            StringBuilder sb = new StringBuilder(sr.ReadToEnd());
            sr.Close();

            // Formatear el EBXML
            sb.Replace("vct:", "");
            sb.Replace("vram:", "");

            string s = sb.ToString();
            int pos = s.IndexOf("<suce");
            int pos2 = s.IndexOf(">", pos + 1);
            s = s.Remove(pos + 5, pos2 - pos - 5);

            XmlDocument xml = new XmlDocument();
            xml.LoadXml(s);
            JSONObject joxml = EBxmlToGestor.Procesar(xml);

            //
            // LLamar a los Stored Procedures
            //
            IPkgEbxml eb = PkgEbxmlFactory.create();
            JSONArray ja;
            JSONObject jo;

            // Solicitante
            jo = (JSONObject)((JSONObject)joxml["DocumentHeader"])["PetitionerTradeParty"];
            PkgEbxml.SolicitanteInsertParam persona = eb.solicitanteInsert(p.conn, jo);
            //persona.Solidpersona
            //persona.Repidpersona

            // Empresa
            jo = (JSONObject)joxml["FactoryLocation"];
            PkgEbxml.EmpresaExtranjeraUpdateParam empresa = eb.empresaExtranjeraUpdate(p.conn, jo);
            //empresa.Idpersona

            // Almacen
            jo = (JSONObject)joxml["StorageLocation"];
            PkgEbxml.AlmacenInsertParam almacen = eb.almacenInsert(p.conn, jo);
            //almacen.Almidpersona
            //almacen.Repidpersona

            // Solicitud
            PkgEbxml.SolicitudInsertParam solicitud = eb.newSolicitudInsertParam();
            solicitud.Idsolicitud = Utils.parseInteger(transaccion["idsolicitud"]);
            solicitud.Tipodoc = (string)transaccion["codtipodoc"];
            solicitud.Numedoc = (string)transaccion["docnumero"];
            solicitud.Codiformato = (string)transaccion["codformato"];
            solicitud.Idperssoli = persona.Solidpersona;
            solicitud.Idpersrepr = persona.Repidpersona;
            solicitud.Idpersrepr = persona.Repidpersona;
            solicitud.Idemprext = empresa.Idpersona;
            solicitud.Idpersalma = almacen.Almidpersona;
            solicitud.Idpersrepralma = almacen.Repidpersona;
            solicitud.Fechrecepcion = Utils.parseDate((string)transaccion["fechregistro"]);
            eb.solicitudInsert(p.conn, solicitud);
            //solicitud.Idversion
            transaccion.Add("idversion", solicitud.Idversion);

            // Adjuntos
            PkgEbxml.AdjuntoInsertParam adjunto = eb.newAdjuntoInsertParam();
            ja = (JSONArray)joxml["AttachedDocument"];
            foreach (JSONObject atach in ja)
            {
                adjunto.setValuesFromMap(atach);
                adjunto.Idsolicitud = solicitud.Idsolicitud;
                adjunto.Idversion = solicitud.Idversion;
                eb.adjuntoInsert(p.conn, adjunto);
            }

            // Productos
            PkgEbxml.ProductoInsertParam producto = eb.newProductoInsertParam();
            PkgEbxml.ComposicionInsertParam composicion = eb.newComposicionInsertParam();
            PkgEbxml.AditivoInsertParam aditivo = eb.newAditivoInsertParam();
            PkgEbxml.EnvaseInsertParam envase = eb.newEnvaseInsertParam();
            JSONArray jaProducts = (JSONArray)joxml["FoodIndustrialProduct"];
            foreach (JSONObject prod in jaProducts)
            {
                // Insertar producto
                producto.setValuesFromMap(prod);
                producto.Idsolicitud = solicitud.Idsolicitud;
                producto.Idversion = solicitud.Idversion;
                eb.productoInsert(p.conn, producto);

                // Composicion
                ja = (JSONArray)prod["Composition"];
                foreach (JSONObject comp in ja)
                {
                    composicion.setValuesFromMap(comp);
                    composicion.Idproducto = producto.Idproducto;
                    eb.composicionInsert(p.conn, composicion);
                }

                // Aditivo
                ja = (JSONArray)prod["AdditiveProduct"];
                foreach (JSONObject adit in ja)
                {
                    aditivo.setValuesFromMap(adit);
                    aditivo.Idproducto = producto.Idproducto;
                    eb.aditivoInsert(p.conn, aditivo);
                }

                // Envase
                ja = (JSONArray)prod["LogisticsPackage"];
                foreach (JSONObject env in ja)
                {
                    envase.setValuesFromMap(env);
                    envase.Idproducto = producto.Idproducto;
                    eb.envaseInsert(p.conn, envase);
                }

            }
            */
        }

        private void RegistrarEbxmlMod(ServletBase.Parameters p, JSONObject transaccion, byte[] ebxml)
        {
            if (ebxml == null || ebxml.Length == 0)
                return;

            IPkgEbxml eb = PkgEbxmlFactory.create();

            
            // Solicitud
            PkgEbxml.SolicitudCrearVersionParam solicitud = eb.newSolicitudCrearVersionParam();

            solicitud.Idsolicitud = Utils.parseInteger(transaccion["idsolicitud"]);
            solicitud.Tipodoc = "S";
            solicitud.Numedoc = (string)transaccion["docnumero"];
            solicitud.Fechrecepcion = Utils.parseDate((string)transaccion["fechregistro"]);
            eb.solicitudCrearVersion(p.conn, solicitud);

            //solicitud.Idversion
            transaccion.Add("idversion", solicitud.Idversion);

            //// Adjuntos
            //PkgEbxml.AdjuntoInsertParam adjunto = eb.newAdjuntoInsertParam();
            //ja = (JSONArray)joxml["AttachedDocument"];
            //foreach (JSONObject atach in ja)
            //{
            //    adjunto.setValuesFromMap(atach);
            //    adjunto.Idsolicitud = solicitud.Idsolicitud;
            //    adjunto.Idversion = solicitud.Idversion;
            //    eb.adjuntoInsert(p.conn, adjunto);
            //}

        }
    }
}